API


Posted by ericcch24 on 2020-10-16

  • 簡單串接 HTTP API
    ```javascript=
    const request = require('request');
    const process = require('process')

//從 https://reqres.in/ 找測試用的 API 素材,發 request 到網址,API 會回傳資料
//如果只有 request 就都是預設方法是 get,所以也可以 request.get(....)
request('https://reqres.in/api/users/' + process.argv[2], function (error, response, body) {
//console.error('error:', error);
//console.log('statusCode:', response && response.statusCode);
console.log(body);
});

// https://github.com/request/request 可以查詢 request API 用法
// post 的請求,輸入 user 資料
request.post(
{
url:'https://reqres.in/api/users',
form: {
name: 'eric',
job: 'none'
}
},
function (error, response, body) {
//console.error('error:', error);
//console.log('statusCode:', response && response.statusCode);
console.log(body);
}
);

----
### Race Condition
```javascript=
for(let i=1; i<=5; i++) {
  request('https://example.com/api/messages/'+ i, (err, res, body) => {
    console.log(`第${i}個留言`, body);
  })
}

這是拿第一篇到第五篇文章的內容的 API,請問最後 log 出來的結果會是什麼?

12345 嗎?

不是,結果是不一定。

有可能是 12345,也有可能是 54321,甚至是 13542,每一種排列組合都有可能。

原因是:「從你電腦發 Request 到 Server 的時間」跟「Server 的處理時間」以及「從 Server 發 Response 傳到你電腦的時間」這三者都是「無法估計」的。

所以如果我拿出下面這段程式碼:

const request = require('request');

// 新增留言
request.post({
  url: 'https://example.com/api/messages',
  form: { content: '新留言' }
}, (err, res) => {
  console.log('新增成功!');
})

// 抓取所有留言
request('https://example.com/api/messages', (err, res, body) => {
  console.log('所有留言:', body)
})

問你說結果會是什麼,答案是:「不知道」。

這種情況就叫做 race condition,最後的產出完全憑當下他們競爭的結果,你在事前無法預料結果是什麼。你有可能先新增留言,也有可能先拿到結果,每一種都有可能,所以結果變得無法預期。

所以這種情況當然要避免。

那怎麼避免?最好的方法當然就是:「確保第一個 request 處理完成時,我才發送第二個 request」。

那我怎樣才知道第一個處理完了?當然就是從我拿到第一個的 response 的時候,我自然就知道第一個處理完了,不然我不可能拿得到 response 嘛。

所以呢,你要這樣寫才是對的,確保新增留言成功,再去抓取留言:

const request = require('request');

// 新增留言
request.post({
  url: 'https://example.com/api/messages',
  form: { title: '新留言' }
}, (err, res) => {
  console.log('新增成功!');

  // 確保新增成功,才去抓取所有留言
  request('https://example.com/api/messages', (err, res, body) => {
    console.log('所有留言:', body)
  })
})

這樣是唯一能保證順序的方法。牽扯的網路的東西都是非同步的,而非同步就代表著順序是無法被預知的。你只能靠著自己寫 code 來掌握正確的順序。

tags: Week4

#week4







Related Posts

JS 展開  (Spread Operator) 以及反向展開 (Rest Parameters)

JS 展開 (Spread Operator) 以及反向展開 (Rest Parameters)

Jump Diffusion Option Valuation in  Discrete Time

Jump Diffusion Option Valuation in Discrete Time

Day 170

Day 170


Comments